#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <time.h>
#include <sys/wait.h>

int main(int argc, char ** argv) {
	int time, size;
	if (argc != 4) {
		printf("Zle wywolanie. Poprawne wywolanie: ./archiwizuj <nazwa_pliku> <czestosc_sprawdzania> <minimalna_wielkosc_pliku>\n");
		return -1;
	}
	time = atoi(argv[2]);
	size = atoi(argv[3]);
	if (time <= 0 || size <= 0) {
		printf("Argumenty 2 i 3 muszą być dodatnie!\n");
		return -3;
	}
	DIR * directory = opendir("./archiwum");
	if ( directory == NULL ) {
		system("mkdir archiwum");
	} else {
		closedir(directory);
	}
	
	struct stat stats;
	int last_mod_time = 0, status;
	pid_t pid;
	while (1) {
		if (lstat(argv[1], &stats) < 0) {
			printf("Blad lstat\n");
			return -4;
		}
		int current_mod_time = stats.st_mtime;
		if ((int)stats.st_size > size && current_mod_time != last_mod_time) {
			pid = vfork();
			if (pid < 0) {
				perror("fork");
				return -5;
			} else if (pid == 0) {
				struct tm czas;
				localtime_r(&stats.st_mtime, &czas);
				char * current_date = (char *)malloc(sizeof(char) * 20);
				sprintf(current_date, "_%d-%d-%d_%d-%d-%d", czas.tm_year + 1900, czas.tm_mon + 1, czas.tm_mday, czas.tm_hour, czas.tm_min, czas.tm_sec);   
				char * back_name = (char *)malloc(sizeof(char) * 128);
				sprintf(back_name, "./archiwum/%s%s", argv[1], current_date);
				printf("Kopiuję plik do archiwum!\n");
				_exit(execl("/bin/cp", "cp", argv[1], back_name, NULL));
				free(current_date);
				free(back_name);
			}
			wait(&status);
			printf("Czyszczę stary plik!\n");
			FILE * plik = fopen(argv[1],"w");
			fclose(plik);
			last_mod_time = stats.st_mtime;
		}
		sleep(time);		
	}
	
	return 0;
}
